//============================================================================================
/**
 * @file	pkthln_throw_sub.c
 * @brief	玉投げサブ画面
 * @author	Nozomu Saito
 *
 * モジュール名：ThrowSub_
 */
//============================================================================================

#include "pkthln_throw_sub.h"
#include "strbuf_family.h"
#include "system/softsprite.h"
#include "system/arc_tool.h"
#include "system/gra_tool.h"
#include "system/clact_util_vram.h"
#include "system/fontproc.h"
#include "system/msgdata_util.h"
#include "system/wordset.h"
#include "poketool/poke_tool.h"

#include "../../../../field/field_cutin.naix"

#include "throw_obj_pri.h"
#include "../pkthln_act_def.h"
#include "../../poke_clact.h"

#include "msgdata/msg.naix"
#include "msgdata/msg_pokethlon.h"

#include "pkthev_throw.naix"
#include "throw_comm.h"

#define TRANS_POKE_NUM	(ENTRY_MAX)
#define BG_PRI	(3)

//ＢＭＰ関連
#define	THROW_SYS_FONT_PAL	(15)
#define FONT_PAL	(THROW_SYS_FONT_PAL)
#define WIN_CGX_BASE	(1)
#define WIN_POKENAME_CGX	(WIN_CGX_BASE)
#define MSG_BG	(GF_BGL_FRAME0_S)

#define WIN_NAME_PX		(5)
#define WIN_NAME_PY		(19)
#define WIN_NAME_SX		(8)
#define WIN_NAME_SY		(2)
#define	COL_N_WHITE	( GF_PRINTCOLOR_MAKE( 15, 14, 0 ) )		// フォントカラー：白

#define POKE_GRA_CHR_ADR_OFS	((24)*32)
//↑24キャラのオフセット後、ポケグラキャラアドレスになっている（グラフィックデータ依存）
#define POKE_GRA_PAL_ADR_OFS	(32)
//↑パレット１本分オフセット後、ポケグラパレットアドレスになっている（グラフィックデータ依存）
#define POKE_GRA_CHR_SIZE	(104*32)		//10ｘ10だが、1D256K設定のため、8の倍数アドレスになっているので注意
#define POKE_GRA_PAL_SIZE	(32)

#define FLAG_FILL_POS_X	(0)//旗のフィル開始X位置（キャラ）
#define FLAG_FILL_POS_Y	(18)//旗のフィル開始Y位置（キャラ）

#define FLAG_W	(4)			//旗のキャラ幅
#define POINT_SCR_SIZE_W	(20)	//転送元スクリーン横幅（キャラ）
#define POINT_SCR_SIZE_H	(20)	//転送元スクリーン横幅（キャラ）
#define FLAG_TRNS_POS_Y		(16)	//旗の転送開始Y位置（キャラ）

#define POINT_DIGI_MAX	(3)
#define POINT_NUMBER_W		(4)		//得点数字横キャラ幅
#define POINT_NUMBER_H		(8)		//得点数字縦キャラ幅
#define NUMBER_SCR_NUM_W	(5)		//数字スクリーンデータの横の数字の数	スクリーンデータに依存
#define NUMBER_SCR_NUM_H	(2)		//数字スクリーンデータの縦の数字の数	スクリーンデータに依存
#define POINT_DISP_START_X	(19)	//得点描画開始X位置（キャラ）
#define POINT_DISP_START_Y	(16)		//得点描画開始Y位置（キャラ）

#define SHAKE_NUM_MAX	(10)		//画面揺らし回数
#define SHAKE_OFS	(8)			//画面揺らし幅

typedef struct POKE_GRA_tag
{
	void *PokeChar;
	void *PokePal;
}POKE_GRA;

typedef struct THROW_SUB_CNT_tag
{
	int HeapID;
	PKTHLN_PTR PkthlnPtr;		//ポケスロンポインタ	これで、マイステータスとかにアクセスする

	GF_BGL_INI * Bgl;
	GF_BGL_BMPWIN	Win;			// BMPウィンドウデータ

	void *PointBgArc;
	NNSG2dScreenData *PointScrnData;

	POKE_GRA	PokeGra[ENTRY_MAX];
	u32 ImageVram[TRANS_POKE_NUM];
	u32 PaletteVram[TRANS_POKE_NUM];
	PKTHLN_ACT_PTR	ActPtr[TRANS_POKE_NUM];	//ポケグラ
	PKTHLN_ACT_PTR	SweatActPtr[TRANS_POKE_NUM];	//ポケグラの汗

	u8 LocalPokeIdx[ENTRY_MEMBER_NUM_MAX];

	u8 ShakeReq;
	u8 ShakeCount;
	u8 dummy[2];

}THROW_SUB_CNT;

//ＢＮＰウィンドウデータ
static const BMPWIN_DAT ThrowEvtBmpData = {
		MSG_BG, WIN_NAME_PX, WIN_NAME_PY,
		WIN_NAME_SX, WIN_NAME_SY, FONT_PAL, WIN_POKENAME_CGX
};

static void SetupPokeGraphic(THROW_SUB_CNT_PTR ptr, const MONS_INFO *inInfoList);
static void SetPokeGra(PKTHLN_CLACT_CNT_PTR inActCntPtr, THROW_SUB_CNT_PTR ptr, const MONS_INFO *inInfoList);
static void TransPokeGra( THROW_SUB_CNT_PTR ptr );
static void AttouchPokeVramAdr( PKTHLN_CLACT_CNT_PTR inActPtr, THROW_SUB_CNT_PTR ptr );
static void CreateBmpWin( THROW_SUB_CNT_PTR ptr );
static void WriteName(THROW_SUB_CNT_PTR ptr);


#ifdef PM_DEBUG
typedef struct DBG_POKE_GRA_tag
{
	POKE_GRA	Gra;
	s16 MonsNo[3];
	u8 Sex[3];
	u8 Form[3];
	u8 Rare[3];
	u8 Count;
}DBG_POKE_GRA;

DBG_POKE_GRA Dpg;
#endif

//----------------------------------------------------------------------------
/**
 *	@brief	初期化
 *
 *	@param	inHeapID	ヒープＩＤ
 *	@param	*inBgl		BGL
 *	@param	pkthlnPtr 	ポケスロンポインタ
 *
 *	@return	コントローラポインタ
 */
//-----------------------------------------------------------------------------
THROW_SUB_CNT_PTR ThrowSub_Init( const int inHeapID, GF_BGL_INI *inBgl, PKTHLN_PTR pkthlnPtr )
{
	int i;
	THROW_SUB_CNT_PTR ptr;
	int size;
	size = sizeof(THROW_SUB_CNT);

	ptr = sys_AllocMemory( inHeapID, size );
	MI_CpuClear8( ptr, size);

	ptr->HeapID = inHeapID;

	ptr->Bgl = inBgl;

	ptr->PkthlnPtr = pkthlnPtr;

	//BMP
	CreateBmpWin(ptr);

	WriteName(ptr);

#ifdef PM_DEBUG
	MI_CpuClear8(&Dpg,sizeof(DBG_POKE_GRA));
#endif

	return ptr;
}

//----------------------------------------------------------------------------
/**
 *	@brief	解放
 *
 *	@param	ptr	コントローラポインタ
 *
 *	@return	none
 */
//-----------------------------------------------------------------------------
void ThrowSub_Free(THROW_SUB_CNT_PTR ptr)
{
	int i;
	for(i=0;i<ENTRY_MAX;i++){
		sys_FreeMemoryEz( ptr->PokeGra[i].PokeChar );
		sys_FreeMemoryEz( ptr->PokeGra[i].PokePal );
	}
	//スクリーンアーカイブ解放
	sys_FreeMemoryEz(ptr->PointBgArc);

	//BMP
	GF_BGL_BmpWinDel( &ptr->Win );

	sys_FreeMemoryEz(ptr);
}

//----------------------------------------------------------------------------
/**
 *	@brief		スクリーンセット
 *
 *	@param	ptr			コントローラポインタ
 *	@param	inNetID		ネットID
 *
 *	@return	none
 */
//-----------------------------------------------------------------------------
void ThrowSub_SetBG(THROW_SUB_CNT_PTR ptr, const u8 inNetID)
{
	//キャラ
	ArcUtil_BgCharSet(ARC_PKTHEV_THROW, NARC_pkthev_throw_throw_bg_sub01_ncgr,
						ptr->Bgl, GF_BGL_FRAME3_S, 0, 0x2000, FALSE, ptr->HeapID);
	ArcUtil_BgCharSet(ARC_PKTHEV_THROW, NARC_pkthev_throw_throw_bg_sub02_ncgr,
						ptr->Bgl, GF_BGL_FRAME2_S, 0, 0, FALSE, ptr->HeapID);
	//スクリーン
	ArcUtil_ScrnSet(ARC_PKTHEV_THROW, NARC_pkthev_throw_throw_bg_sub01_nscr,
						ptr->Bgl, GF_BGL_FRAME3_S, 0, 0, FALSE, ptr->HeapID);
	ArcUtil_ScrnSet(ARC_PKTHEV_THROW, NARC_pkthev_throw_throw_bg_sub02_nscr,
						ptr->Bgl, GF_BGL_FRAME2_S, 0, 0, FALSE, ptr->HeapID);
	ArcUtil_ScrnSet(ARC_PKTHEV_THROW, NARC_pkthev_throw_throw_bg_sub03_nscr,
						ptr->Bgl, GF_BGL_FRAME1_S, 0, 0, FALSE, ptr->HeapID);

	ptr->PointBgArc = ArcUtil_ScrnDataGet(ARC_PKTHEV_THROW, NARC_pkthev_throw_throw_bg_sub_point_nscr,
						FALSE, &ptr->PointScrnData, ptr->HeapID);

	//サブパレット
	ArcUtil_PalSet( ARC_PKTHEV_THROW, NARC_pkthev_throw_throw_bg_sub_nclr,
						PALTYPE_SUB_BG, 0, 32*4, ptr->HeapID );

	//旗部分のフィル
	GF_BGL_ScrWriteFree(ptr->Bgl, GF_BGL_FRAME1_S,
				FLAG_FILL_POS_X, FLAG_FILL_POS_Y, FLAG_W, FLAG_W,
				&ptr->PointScrnData->rawData,
				inNetID*FLAG_W, FLAG_TRNS_POS_Y, POINT_SCR_SIZE_W, POINT_SCR_SIZE_H );
	GF_BGL_LoadScreenV_Req(ptr->Bgl, GF_BGL_FRAME1_S);
}

//----------------------------------------------------------------------------
/**
 *	@brief		ＯＢＪセット
 *
 *	@param	ptr			コントローラポインタ
 *	@param	pActCntPtr	アクターコントローラポインタ
 *
 *	@return	none
 */
//-----------------------------------------------------------------------------
void ThrowSub_SetObj(THROW_SUB_CNT_PTR ptr, PKTHLN_CLACT_CNT_PTR pActCntPtr)
{
	PkthlnClAct_SetChar( pActCntPtr,
						ARC_PKTHEV_THROW, NARC_pkthev_throw_throw_obj_sub_NCGR,
						RES_CODE_THROW_SUB, NNS_G2D_VRAM_TYPE_2DSUB);
	PkthlnClAct_SetPaltt( pActCntPtr,
					ARC_PKTHEV_THROW, NARC_pkthev_throw_throw_obj_sub_NCLR,
					RES_CODE_THROW_SUB, NNS_G2D_VRAM_TYPE_2DSUB, THROW_OBJ_SUB_PAL_NUM	);
	PkthlnClAct_SetCell( pActCntPtr,
						ARC_PKTHEV_THROW, NARC_pkthev_throw_throw_obj_sub_NCER, RES_CODE_THROW_SUB	);
	PkthlnClAct_SetAnm(	pActCntPtr,
						ARC_PKTHEV_THROW, NARC_pkthev_throw_throw_obj_sub_NANR, RES_CODE_THROW_SUB	);
}

//--------------------------------------------------------------------------------------------
/**
 * アクターセットアップ
 *
 * @param 	ptr			コントローラポインタ
 * @param	pActCntPtr	アクターコントローラポインタ
 * @param	inInfoList	モンスター情報構造体ポインタ
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
void ThrowSub_SetPokeAct( 	THROW_SUB_CNT_PTR ptr,
							PKTHLN_CLACT_CNT_PTR pActCntPtr,
							const MONS_INFO *inInfoList	)
{
	int i;
	//ポケグラ汗
	for(i=0;i<TRANS_POKE_NUM;i++){
		PkthlnClAct_SetActor(pActCntPtr, BG_PRI, NNS_G2D_VRAM_TYPE_2DSUB,
				RES_CODE_THROW_SUB, ACT_CODE_THROW_SUB_SWEAT);
	}

	//ポケグラ
	SetPokeGra(pActCntPtr, ptr, inInfoList);
}

//----------------------------------------------------------------------------
/**
 *	@brief	ポケグラの汗表示
 *
 *	@param	ptr	コントローラポインタ
 *	@param	inIdx		アクターインデックス
 *	@param	inVisible	可視・不可視	（0で不可視それ以外で可視）
 *
 *	@return	none
 */
//-----------------------------------------------------------------------------
void  ThrowSub_SetDrawSweat(THROW_SUB_CNT_PTR ptr,const u8 inIdx, const u8 inVisible)
{
	PkthlnClAct_SetActive(ptr->SweatActPtr[inIdx], 1, inVisible);
}

//----------------------------------------------------------------------------
/**
 *	@brief	得点のフィル
 *
 *	@param	cnt_ptr		コントローラポインタ
 *	@param	inPoint		得点
 *
 *	@return	none
 */
//-----------------------------------------------------------------------------
void ThrowSub_FillPoint(THROW_SUB_CNT_PTR cnt_ptr, const u16 inPoint)
{
	u8 i;
	u16 h,t,o;
	u8 read_x[POINT_DIGI_MAX];
	u8 read_y[POINT_DIGI_MAX];

	//3桁の数を3つに分解
	h = inPoint/100;
	t = inPoint - (h*100);
	t /= 10;
	o = inPoint%10;

	//データ読み込み位置を算出(数字スクリーンデータに依存)
	read_x[0] = (h%NUMBER_SCR_NUM_W)*POINT_NUMBER_W;
	read_y[0] = (h/NUMBER_SCR_NUM_W)*POINT_NUMBER_H;
	read_x[1] = (t%NUMBER_SCR_NUM_W)*POINT_NUMBER_W;
	read_y[1] = (t/NUMBER_SCR_NUM_W)*POINT_NUMBER_H;
	read_x[2] = (o%NUMBER_SCR_NUM_W)*POINT_NUMBER_W;
	read_y[2] = (o/NUMBER_SCR_NUM_W)*POINT_NUMBER_H;

	for (i=0;i<POINT_DIGI_MAX;i++){
		GF_BGL_ScrWriteFree(cnt_ptr->Bgl, GF_BGL_FRAME1_S,
				POINT_DISP_START_X+(i*POINT_NUMBER_W), POINT_DISP_START_Y,
				POINT_NUMBER_W, POINT_NUMBER_H,
				&cnt_ptr->PointScrnData->rawData,
				read_x[i], read_y[i], POINT_SCR_SIZE_W, POINT_SCR_SIZE_H );
	}

	GF_BGL_LoadScreenV_Req(cnt_ptr->Bgl, GF_BGL_FRAME1_S);
}

//----------------------------------------------------------------------------
/**
 *	@brief	ポケアニメの変更
 *
 *	@param	cnt_ptr		コントローラポインタ
 *	@param	inIdx		ポケモンインデックス
 *	@param	inAnm		アニメ
 *
 *	@return	none
 */
//-----------------------------------------------------------------------------
void ThrowSub_ChgPokeAnm(THROW_SUB_CNT_PTR cnt_ptr, const u8 inIdx, const MY_POKE_ANM inAnm)
{
	GF_ASSERT(inIdx < ENTRY_MAX);
	PkthlnClAct_ChgAnmCheck(cnt_ptr->ActPtr[inIdx], inAnm+inIdx);
}

//----------------------------------------------------------------------------
/**
 *	@brief	アニメ中かチェック
 *
 *	@param	cnt_ptr		コントローラポインタ
 *	@param	inIdx		ポケモンインデックス
 *
 *	@return	BOOL		TRUE：アニメ中
 */
//-----------------------------------------------------------------------------
BOOL ThrowSub_PokeAnmCheck(THROW_SUB_CNT_PTR cnt_ptr, const u8 inIdx)
{
	return PkthlnClAct_AnmActiveCheck(cnt_ptr->ActPtr[inIdx]);
}

//----------------------------------------------------------------------------
/**
 *	@brief	画面ゆれリクエスト
 *
 *	@param	cnt_ptr		コントローラポインタ
 *
 *	@return	none
 */
//-----------------------------------------------------------------------------
void ThrowSub_DispShakeRequest(THROW_SUB_CNT_PTR cnt_ptr)
{
	cnt_ptr->ShakeReq = 1;
	cnt_ptr->ShakeCount = 0;
}

//----------------------------------------------------------------------------
/**
 *	@brief	画面ゆれ
 *
 *	@param	cnt_ptr		コントローラポインタ
 *
 *	@return	none
 */
//-----------------------------------------------------------------------------
void ThrowSub_DispShakeMain(THROW_SUB_CNT_PTR cnt_ptr)
{
	if (cnt_ptr->ShakeReq){		//リクエストを受けているならば実行
		int y_ofs;
		cnt_ptr->ShakeCount++;
		y_ofs = (cnt_ptr->ShakeCount%2)*(-1)*SHAKE_OFS;

		if (cnt_ptr->ShakeCount >= SHAKE_NUM_MAX){
			//リクエストオフ
			cnt_ptr->ShakeReq = 0;
			cnt_ptr->ShakeCount = 0;
			y_ofs =0;
		}

		GF_BGL_ScrollReq( cnt_ptr->Bgl, GF_BGL_FRAME0_S, GF_BGL_SCROLL_Y_SET, y_ofs );
		GF_BGL_ScrollReq( cnt_ptr->Bgl, GF_BGL_FRAME1_S, GF_BGL_SCROLL_Y_SET, y_ofs );
		GF_BGL_ScrollReq( cnt_ptr->Bgl, GF_BGL_FRAME2_S, GF_BGL_SCROLL_Y_SET, y_ofs );
	}else{
		GF_BGL_ScrollReq( cnt_ptr->Bgl, GF_BGL_FRAME0_S, GF_BGL_SCROLL_Y_SET, 0 );
		GF_BGL_ScrollReq( cnt_ptr->Bgl, GF_BGL_FRAME1_S, GF_BGL_SCROLL_Y_SET, 0 );
		GF_BGL_ScrollReq( cnt_ptr->Bgl, GF_BGL_FRAME2_S, GF_BGL_SCROLL_Y_SET, 0 );
	}
}

//--------------------------------------------------------------------------------------------
/**
 * ペン表示
 *
 * @param 	cnt_ptr			コントローラポインタ
 * @param	inActCntPtr		ポケスロンアクターコントローラポインタ
 * @param	inResCntPtr		共通リソースコントローラポインタ
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
void ThrowSub_SetPen(	THROW_SUB_CNT_PTR cnt_ptr,
						PKTHLN_CLACT_CNT_PTR inActCntPtr,
						CMN_RES_CNT_PTR inResCntPtr)
{
	int i;
	PEN_POS	pen_pos[ENTRY_MAX];
	for (i=0;i<ENTRY_MAX;i++){
		const VecFx32 *vec;
		//ポケ座標取得
		vec = PkthlnClAct_GetPos(cnt_ptr->ActPtr[i]);
		pen_pos[i].X = vec->x / FX32_ONE;
		pen_pos[i].Y = vec->y / FX32_ONE;
		//ペン表示
		PTFrame_SetPen( cnt_ptr->PkthlnPtr, 0, inResCntPtr, inActCntPtr,
				NNS_G2D_VRAM_TYPE_2DSUB, ENTRY_MAX,  pen_pos);
	}
}


//----------------------------------------------------------------------------
/**
 *	@brief		ポケグラフィックセット
 *
 *	@param	ptr			コントローラポインタ
 *	@param	inInfoList	モンスター情報
 *
 *	@return	none
 */
//-----------------------------------------------------------------------------
static void SetupPokeGraphic(THROW_SUB_CNT_PTR ptr, const MONS_INFO *inInfoList)
{
	int i;
	SOFT_SPRITE_ARC sprite;
	//最後の引数は、FormNoと個性乱数です by soga 2006.05.01

	for(i=0;i<ENTRY_MAX;i++){
		const MONS_INFO *info;
		info = &inInfoList[i];
		PokeGraArcDataGet( &sprite, info->MonsNo, info->Sex, PARA_BACK, info->Rare, info->Form, info->PsnlRnd );

		ptr->PokeGra[i].PokeChar =
			Ex_ChangesInto_BattlePokeData_Alloc(sprite.arc_no, sprite.index_chr, ptr->HeapID,
				info->PsnlRnd, FALSE, PARA_BACK, info->MonsNo);
		ptr->PokeGra[i].PokePal =
			ChangesInto_BattlePokePalData_Alloc( sprite.arc_no, sprite.index_pal, ptr->HeapID);
	}
}

//----------------------------------------------------------------------------
/**
 *	@brief	ポケモンセット
 *
 *	@param	inActCntPtr	アクターコントローラポインタ
 *	@param	ptr			コントローラポインタ
 *	@param	inInfoList	モンスター情報
 *
 *	@return	none
 */
//-----------------------------------------------------------------------------
static void SetPokeGra(PKTHLN_CLACT_CNT_PTR inActCntPtr, THROW_SUB_CNT_PTR ptr, const MONS_INFO *inInfoList)
{
	int i;
	for(i=0;i<ENTRY_MAX;i++){
		PkthlnClAct_SetActor(	inActCntPtr, BG_PRI,
								NNS_G2D_VRAM_TYPE_2DSUB,
								RES_CODE_THROW_SUB, ACT_CODE_THROW_SUB_POKE	);
	}
	for(i=0;i<ENTRY_MAX;i++){
		const MONS_INFO *info;
		VecFx32 vec;
		int height;

		info = &inInfoList[i];
		ptr->ActPtr[i] =
			PkthlnClAct_GetActPtr(inActCntPtr, RES_CODE_THROW_SUB, ACT_CODE_THROW_SUB_POKE);
		vec.z = 0;
		vec.x = ( MY_POKE_BASE_X + (MY_POKE_MARGINE_X*i) ) * FX32_ONE;
		height = PokeHeightGet(info->MonsNo, info->Sex , PARA_BACK, info->Form ,info->PsnlRnd);
///		OS_Printf("%d:poke_height = %d\n",info->MonsNo, height);
		vec.y = ( MY_POKE_BASE_Y + height ) * FX32_ONE;
		PkthlnClAct_SetPos(ptr->ActPtr[i], &vec);
		PkthlnClAct_ChgAnm(ptr->ActPtr[i], 1+i);
		PkthlnClAct_SetActive(ptr->ActPtr[i], 1, 1);	//可視でセット
		//ポケグラのプライオリティセット
		PkthlnClAct_SetPriority(ptr->ActPtr[i], PRI_POKE_MINE+(ENTRY_MAX-1-i));

		//ポケグラ汗
		ptr->SweatActPtr[i] = PkthlnClAct_GetActPtr(inActCntPtr, RES_CODE_THROW_SUB, ACT_CODE_THROW_SUB_SWEAT);
		PkthlnClAct_ChgAnm(ptr->SweatActPtr[i], 0);
		vec.y -= SWEAT_OFS;
		PkthlnClAct_SetPos(ptr->SweatActPtr[i], &vec);
		//プライオリティ
		PkthlnClAct_SetPriority(ptr->SweatActPtr[i], PRI_SWEAT);
	}

	//ポケグラのセットアップ
	SetupPokeGraphic(ptr, inInfoList);
	//ポケグラの転送VRAMを割り当てる
	AttouchPokeVramAdr( inActCntPtr, ptr );
	//トランス
	TransPokeGra( ptr );
}
//----------------------------------------------------------------------------
/**
 *	@brief		ポケグラフィック転送
 *
 *	@param	ptr		コントローラ
 *
 *	@return	none
 */
//-----------------------------------------------------------------------------
static void TransPokeGra( THROW_SUB_CNT_PTR ptr)
{
	u8 i;
	int chr_trans_size;
	int plt_trans_size;

	chr_trans_size = (32*10)*10;	//32byte x10 y10
	plt_trans_size = 32;	//32byte

	for (i=0;i<ENTRY_MAX;i++){
		DC_FlushRange(ptr->PokeGra[i].PokeChar,chr_trans_size);
		GXS_LoadOBJ( ptr->PokeGra[i].PokeChar, ptr->ImageVram[i], chr_trans_size );

		DC_FlushRange( ptr->PokeGra[i].PokePal, plt_trans_size );
		GXS_LoadOBJPltt( ptr->PokeGra[i].PokePal, ptr->PaletteVram[i], plt_trans_size );	//32byte 1Palette
	}
}

//----------------------------------------------------------------------------
/**
 *	@brief	ＶＲＡＭアドレス割り当て
 *
 *	@param	inActPtr		アクターコントローラポインタ
 *	@param	ptr 				コントローラポインタ
 *
 *	@return
 */
//-----------------------------------------------------------------------------
static void AttouchPokeVramAdr( PKTHLN_CLACT_CNT_PTR inActPtr, THROW_SUB_CNT_PTR ptr )
{
	CLACT_U_RES_OBJ_PTR res_obj_ptr;
	CLACT_U_RES_OBJ_PTR res_pal_ptr;
	NNSG2dImageProxy *image_proxy;
	const NNSG2dImagePaletteProxy *palette_proxy;

	u8 i;

	res_obj_ptr = *PkthlnClAct_GetResObjPtrAdr( inActPtr, RES_CODE_THROW_SUB , CLACT_U_CHAR_RES );
	res_pal_ptr = *PkthlnClAct_GetResObjPtrAdr( inActPtr, RES_CODE_THROW_SUB , CLACT_U_PLTT_RES );
	image_proxy = CLACT_U_CharManagerGetProxy( res_obj_ptr );
	palette_proxy = CLACT_U_PlttManagerGetProxy( res_pal_ptr, image_proxy );
	for(i=0;i<TRANS_POKE_NUM;i++){
		ptr->ImageVram[i] = POKE_GRA_CHR_ADR_OFS + (POKE_GRA_CHR_SIZE*i) +
							NNS_G2dGetImageLocation( image_proxy, NNS_G2D_VRAM_TYPE_2DSUB );
		ptr->PaletteVram[i] = POKE_GRA_PAL_ADR_OFS + (POKE_GRA_PAL_SIZE*i) +
							NNS_G2dGetImagePaletteLocation( palette_proxy, NNS_G2D_VRAM_TYPE_2DSUB );
	}
}

//--------------------------------------------------------------------------------------------
/**
 * BMPウィンドウ追加
 *
 * @param 	ptr			コントローラポインタ
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void CreateBmpWin( THROW_SUB_CNT_PTR ptr )
{
	const BMPWIN_DAT * dat = &ThrowEvtBmpData;

	GF_BGL_BmpWinAddEx( ptr->Bgl, &ptr->Win, dat );

	//先頭キャラをクリア（スクリーンクリアされてるところは、このキャラで埋まる）
	GF_BGL_CharFill( ptr->Bgl, MSG_BG, 0, 1, 0 );

	//システム用フォントパレット転送
	SystemFontPaletteLoad(PALTYPE_SUB_BG, THROW_SYS_FONT_PAL*32, ptr->HeapID);

	GF_BGL_BmpWinDataFill( &ptr->Win, 0 );
}

//--------------------------------------------------------------------------------------------
/**
 * 名前書く
 *
 * @param 	ptr			コントローラポインタ
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void WriteName(THROW_SUB_CNT_PTR ptr)
{
	u8 my_id;
	STRBUF *name_buf;

	my_id = PTFrameGetCurrentID(ptr->PkthlnPtr);
	//マイステータスにアクセスして名前取得
	name_buf = MyStatus_CreateNameString(
				PTFrame_GetMyStatus(ptr->PkthlnPtr, my_id),
				ptr->HeapID);
	GF_STR_PrintColor( 	&ptr->Win, FONT_SYSTEM, name_buf,
				0, 0, MSG_NO_PUT, COL_N_WHITE, NULL );
	STRBUF_Delete(name_buf);
	GF_BGL_BmpWinOn(&ptr->Win);
}




#ifdef PM_DEBUG
static u8 DecideSex(const u16 inMonsNo)
{
	u8	sex_vec;
	u8 sex;
	sex_vec = PokePersonalParaGet(inMonsNo, ID_PER_sex);
	switch(sex_vec){
	case	MONS_MALE:		//オスのみ
		sex = PARA_MALE;
		break;
	case	MONS_FEMALE:	//メスのみ
		sex = PARA_FEMALE;
		break;
	case	MONS_UNKNOWN:	//性別なし
		sex = PARA_UNK;
		break;
	default:				//オスメス存在する場合はオスをセット
		sex = PARA_MALE;
	}

	return sex;
}

static u8 ChgSex(DBG_POKE_GRA *dpg, const u8 inIdx)
{
	u8	sex_vec;
	u8 sex;

	//現在のモンスターナンバーを調べる
	if ( (dpg->MonsNo[inIdx] <= 0)||(dpg->MonsNo[inIdx] > MONSNO_END) ){
		return 0;
	}

	//指定モンスターの性別ベクトル別に処理を分岐
	sex_vec = PokePersonalParaGet(dpg->MonsNo[inIdx], ID_PER_sex);
	switch(sex_vec){
	case	MONS_MALE:		//オスのみ
	case	MONS_FEMALE:	//メスのみ
	case	MONS_UNKNOWN:	//性別なし
		//変更不可
		return 0;
	default:				//オスメス存在する場合は変更可
		if (dpg->Sex[inIdx] == PARA_MALE){
			dpg->Sex[inIdx] = PARA_FEMALE;
		}else{
			dpg->Sex[inIdx] = PARA_MALE;
		}
	}
	return 1;
}

void PokeGraDebugMain(THROW_SUB_CNT_PTR ptr)
{
	u8 idx;
	u8 mons_chg, dat_chg;
	SOFT_SPRITE_ARC sprite;

	mons_chg = 0;
	dat_chg = 0;

	if (sys.cont & PAD_KEY_LEFT){
		idx = 0;
	}else if(sys.cont & PAD_KEY_DOWN){
		idx = 1;
	}else if(sys.cont & PAD_KEY_RIGHT){
		idx = 2;
	}else {
		Dpg.Count = 0;
		return;
	}

	//モンスターナンバー変更
	if (sys.trg & PAD_BUTTON_L){
		dat_chg = 1;
		mons_chg = 1;
		Dpg.MonsNo[idx]--;
		if ( Dpg.MonsNo[idx] <= 0){
			Dpg.MonsNo[idx] = MONSNO_END;
		}
	}else if(sys.trg & PAD_BUTTON_R){
		dat_chg = 1;
		mons_chg = 1;
		Dpg.MonsNo[idx]++;
		if ( Dpg.MonsNo[idx] > MONSNO_END){
			Dpg.MonsNo[idx] = 1;
		}
	}else if(sys.cont & PAD_BUTTON_L){
		if (Dpg.Count <= 10){
			Dpg.Count++;
		}else{
			dat_chg = 1;
			mons_chg = 1;
			Dpg.MonsNo[idx]--;
			if ( Dpg.MonsNo[idx] <= 0){
				Dpg.MonsNo[idx] = MONSNO_END;
			}
		}
	}else if(sys.cont & PAD_BUTTON_R){
		if (Dpg.Count <= 10){
			Dpg.Count++;
		}else{
			dat_chg = 1;
			mons_chg = 1;
			Dpg.MonsNo[idx]++;
			if ( Dpg.MonsNo[idx] > MONSNO_END){
				Dpg.MonsNo[idx] = 1;
			}
		}
	}else if(sys.trg & PAD_BUTTON_A){
		dat_chg = 1;
		Dpg.Rare[idx] = (Dpg.Rare[idx]+1)%2;
	}else if(sys.trg & PAD_BUTTON_B){
		dat_chg = 1;
		Dpg.Form[idx] = (Dpg.Form[idx]+1)%28;
	}else if(sys.trg & PAD_BUTTON_Y){
		//性別（あれば変更）
		dat_chg = ChgSex(&Dpg, idx);
	}else{
		Dpg.Count = 0;
		return;
	}

	if (Dpg.MonsNo[idx] == 0){
		Dpg.Count = 0;
		return ;
	}

	if (mons_chg){
		//デフォルト性別取得
		Dpg.Sex[idx] = DecideSex(Dpg.MonsNo[idx]);
		//フォルムは0
		Dpg.Form[idx] = 0;
	}


	//データ書き換えを行ってない場合は処理終了
	if (!dat_chg){
		return;
	}

	//高さ変更
	{
		VecFx32 vec;
		int height;
		height = PokeHeightGet(Dpg.MonsNo[idx], Dpg.Sex[idx] , PARA_BACK, Dpg.Form[idx] ,0);
		vec = *PkthlnClAct_GetPos(ptr->ActPtr[idx]);
		vec.y = ( MY_POKE_BASE_Y + height ) * FX32_ONE;
		PkthlnClAct_SetPos(ptr->ActPtr[idx], &vec);
	}

	PokeGraArcDataGet( &sprite, Dpg.MonsNo[idx], Dpg.Sex[idx], PARA_BACK, Dpg.Rare[idx], Dpg.Form[idx], 0 );

	Dpg.Gra.PokeChar =
			Ex_ChangesInto_BattlePokeData_Alloc(sprite.arc_no, sprite.index_chr, ptr->HeapID,
				0, FALSE, PARA_BACK, Dpg.MonsNo[idx]);
	Dpg.Gra.PokePal =
			ChangesInto_BattlePokePalData_Alloc( sprite.arc_no, sprite.index_pal, ptr->HeapID);

	{
		int chr_trans_size;
		int plt_trans_size;
		chr_trans_size = (32*10)*10;	//32byte x10 y10
		plt_trans_size = 32;	//32byte

		DC_FlushRange(Dpg.Gra.PokeChar,chr_trans_size);
		GXS_LoadOBJ( Dpg.Gra.PokeChar, ptr->ImageVram[idx], chr_trans_size );
		DC_FlushRange( Dpg.Gra.PokePal, plt_trans_size );
		GXS_LoadOBJPltt( Dpg.Gra.PokePal, ptr->PaletteVram[idx], plt_trans_size );	//32byte 1Palette
	}
	//現在確保しているメモリを解放
	sys_FreeMemoryEz( Dpg.Gra.PokeChar );
	sys_FreeMemoryEz( Dpg.Gra.PokePal );

}
#endif